/*
 * @Author: your name
 * @Date: 2020-08-09 12:47:24
 * @LastEditTime: 2020-08-09 13:57:35
 * @LastEditors: your name
 * @Description: In User Settings Edit
 * @FilePath: \day01\demo\facade\facade.go
 */
package facade

import "fmt"

// 外观设计模式 :有结构体构成
// 设计思路:

// 内部实现复杂逻辑，只向外部暴露可以调用的窗口，外部通过窗口来完成对应的功能

// EG:汽车《发动机，制动系统，油门，离合器》等这些，开车的人看不到，却能驾驶

type carFaDongJi struct {
}

func NewCarFaDongJi() *carFaDongJi {
	// 外部调用的实现
	return &carFaDongJi{}
}

func (carFaDongJi carFaDongJi) carFaDongJiAction() {
	fmt.Println("发动机")
}

type carYouMen struct {
}

func NewCarYouMan() *carYouMen {
	return &carYouMen{}
}

func (carYouMen carYouMen) carYouMenAction() {
	fmt.Println("油门")
}

type carLiHeQi struct {
}

func NewCarLiHeQi() *carLiHeQi {
	return &carLiHeQi{}
}

func (carLiHeQi carLiHeQi) carLiHeQiAction() {
	fmt.Println("离合器")
}

type car struct {
	carFaDongJi
	carLiHeQi
	carYouMen
}

func NewCar() *car {
	return &car{
		*NewCarFaDongJi(),
		*NewCarLiHeQi(),
		*NewCarYouMan(),
	}
}

func (car car) CarAction() {
	car.carFaDongJiAction()
	car.carLiHeQiAction()
	car.carYouMenAction()
}
